package com.bcq.bcqrpc.serializer;

import java.io.*;

/**
 * JDK 序列化器
 */
public class JdkSerializer implements Serializer {

    /**
     * 序列化
     *
     * @param object
     * @param <T>
     * @return
     * @throws IOException
     */
    @Override
    public <T> byte[] serialize(T object) throws IOException {
        // 创建一个字节流对象，用于存储序列化的字节信息
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        // 创建一个对象流对象，用于执行序列化操作
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        // 将给定的对象写入到对象流中，完成序列化过程
        objectOutputStream.writeObject(object);
        // 关闭对象流，释放相关资源
        objectOutputStream.close();
        // 返回序列化后的字节数组
        return outputStream.toByteArray();
    }

    /**
     * 反序列化
     *
     * @param bytes
     * @param type
     * @param <T>
     * @return
     * @throws IOException
     */
    @Override
    public <T> T deserialize(byte[] bytes, Class<T> type) throws IOException {
        // 创建一个输入流，用于读取字节数组
        ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
        // 创建一个对象输入流，用于从输入流中读取对象
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        try {
            // 读取对象并进行类型转换，然后返回
            return (T) objectInputStream.readObject();
        } catch (ClassNotFoundException e) {
            // 当读取的对象类型在类路径中找不到时，抛出运行时异常
            throw new RuntimeException(e);
        } finally {
            // 关闭对象输入流，释放资源
            objectInputStream.close();
        }
    }
}
